import com.spire.presentation.*;
import com.spire.presentation.collections.SlideCollection;
import com.spire.presentation.drawing.FillFormatType;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

class AddTextBox {

    public static void main(String[]args) throws Exception {
        //创建文档
        Presentation ppt = new Presentation();
        //加载PowerPoint文档
        ppt.loadFromFile("E:\\test\\ppt\\ppt模板.pptx");
        ISlide slide = ppt.getSlides().get(0);
        ISlide slide1 = ppt.getSlides().get(1);
        ISlide slide2 = ppt.getSlides().get(2);
        ISlide slide3 = ppt.getSlides().get(3);
        ISlide slide4 = ppt.getSlides().get(4);
        ISlide slide5 = ppt.getSlides().get(5);
        ISlide slide6 = ppt.getSlides().get(6);
        ISlide slide7 = ppt.getSlides().get(7);
        ISlide slide8 = ppt.getSlides().get(8);
        ISlide slide9 = ppt.getSlides().get(9);
        ISlide slide10 = ppt.getSlides().get(10);

        List<Integer> copyIndexList = new ArrayList<Integer>();
        List<ISlide> copySlideList = new ArrayList<ISlide>();
        List<String> copyString = new ArrayList<String>();
        List<String> replaceString = new ArrayList<String>();

        //ppt第一页
        Map map = new HashMap();
        map.put("项目名称","中国移动浙江公司\n客户敏感信息安全专项审计\n项目启动会");
        map.put("启动会召开时间","2021年08月");
        replaceText(slide,map);

        //ppt第二页
        Map map2 = new HashMap();
        map2.put("一","一、审计目的与范围");
        map2.put("二","二、审计时间安排");
        map2.put("三","三、审计成果");
        map2.put("四","四、审计团队");
        map2.put("五","五、配合要求");
        map2.put("六","六、审计纪律");
        replaceText(slide1,map2);

        //ppt第三页
        Map map3 = new HashMap();
        map3.put("一","一、审计目的与范围");
        map3.put("小标题","审计目的");
        String content = "本项目旨在准确反映公司对于客户敏感信息的管理现状，贯彻集团总部对客户信息安全保护的管理规定，" +
                "梳理和客户信息相关的IT系统情况，重点审查是否存在信息泄露的风险事件，" +
                "核查客户信息收集、储存及使用的准确性、真实性、时效性、可用性，" +
                "关注敏感数据不出网，审核所有操作可追溯。识别和评估风险，揭示问题和缺陷，" +
                "有针对性地提出管理建议和改进方法，促进公司进一步规范和落实客户信息的管理，" +
                "提供更好的隐私保护，切实保障用户的合法权益，同时也能降低公司的法律风险。" +
                "本项目旨在准确反映公司对于客户敏感信息的管理现状，贯彻集团总部对客户信息安全保护的管理规定，" +
                "梳理和客户信息相关的IT系统情况，重点审查是否存在信息泄露的风险事件，核查客户信息收集、" +
                "储存及使用的准确性、真实性、时效性、可用性，关注敏感数据不出网，审核所有操作可追溯。" +
                "识别和评估风险，揭示问题和缺陷，有针对性地提出管理建议和改进方法，促进公司进一步规范和落实客户信息的管理，" +
                "提供更好的隐私保护，切实保障用户的合法权益，同时也能降低公司的法律风险。况，重点审查是否存在信息泄露的风险事件，" +
                "核查客户信息收集、储存及使用的准确性、真实性、本项目旨在准确反映公司对于客户敏感信息的管理现状，" +
                "贯彻集团总部对客户信息安全保护的管理规定，梳理和客户信息相关的IT系统情况，重点审查是否存在信息泄露的风险事件，" +
                "核查客户信息收集、储存及使用的准确性、真实性、时效性、可用性，关注敏感数据不出网，审核所有操作可追溯。识别和评估风险，" +
                "揭示问题和缺陷，有针对性地提出管理建议和改进方法，促进公司进一步规范和落实客户信息的管理，提供更好的隐私保护，" +
                "切实保障用户的合法权益，同时也能降低公司的法律风险。本项目旨在准确反映公司对于客户敏感信息的管理现状，" +
                "贯彻集团总部对客户信息安全保护的管理规定，梳理和客户信息相关的IT系统情况，重点审查是否存在信息泄露的风险事件，" +
                "核查客户信息收集、储存及使用的准确性、真实性。";
        ISlide iSlideTemp = ppt.getSlides().get(2);
        if (content.length()>500){
            map3.put("正文内容",content.substring(0,500));
            replaceText(iSlideTemp,map3);
            String content1 = content.substring(500,content.length()-1);
            replaceString.add(content.substring(0,500));
            copyString.add(content1);
            copyIndexList.add(2);
            copySlideList.add(slide2);
        }else{
            map3.put("正文内容",content);
            replaceText(iSlideTemp,map3);
        }

        //ppt第四页
        Map map4 = new HashMap();
        map4.put("一","一、审计目的与范围");
        map4.put("小标题","审计范围");
        String content4 = "审计期间：2020年1月至审计当期，如有必要可追溯至以前年度。\n" +
                "审计范围：浙江省3个地市分公司。\n" +
                "涉及流程：包括系统及账号、客户信息全生命周期管理等全流程。";
        ISlide iSlideTemp4 = ppt.getSlides().get(3);
        if (content4.length()>500){
            map4.put("正文内容",content4.substring(0,500));
            replaceText(iSlideTemp4,map4);
            String con = content.substring(500,content.length()-1);
            map4.put("正文内容",con);
            replaceText(slide3,map4);
            copyIndexList.add(4);
            copySlideList.add(slide3);
        }else{
            map4.put("正文内容",content4);
            replaceText(iSlideTemp4,map4);
        }

        //ppt第五页
        Map map5 = new HashMap();
        map5.put("二","二、审计时间安排");
        replaceText(slide4,map5);

        //ppt第六页
        Map map6 = new HashMap();
        map6.put("三","三、审计项目结果");
        replaceText(slide5,map6);
        IAutoShape shape5 = slide5.getShapes().appendShape(ShapeType.RECTANGLE, new Rectangle2D.Float(30, 220, 420, 150));
        shape5.getFill().setFillType(FillFormatType.NONE);
        shape5.getFill().getSolidColor().setColor(new Color(79, 129, 189));
        shape5.getLine().setWidth(1.5d);
        shape5.getTextFrame().getParagraphs().clear();

        String htmlString5 = "<p style='color:black'>与省公司相关业务部门沟通确认具体审计发现。" +
                "<p>与省公司相关业务部门沟通确认具体审计发现。" +
                "<p>与省公司相关业务部门沟通确认具体审计发现：通过OA正式下发审计报告，给出整体审计意见,以及具体审计发现和改进建议。";
        shape5.getTextFrame().getParagraphs().addFromHtml(htmlString5);
        setParagraphStyle(ppt,shape5);

        //ppt第七页
        Map map7 = new HashMap();
        map7.put("四","四、审计团队");
        replaceText(slide6,map7);
        //设置表格行数和列数、行高和列宽
        Double[] widths = new Double[] { 150d, 400d };
        Double[] heights = new Double[] { 60d, 60d, 60d};

        //添加一个表格
        ITable table = slide6.getShapes().appendTable((float)ppt.getSlideSize().getSize().getWidth() / 2 - 275, 200, widths, heights);

        //设置表格内置样式
        table.setStylePreset(TableStylePreset.NO_STYLE_NO_GRID);
        table.setTableBorder(TableBorderType.All, 1, Color.black);
//        table.setStylePreset();
        //声明一个String数组
        String[][] dataStr = new String[][]
                {
                        {"项目负责人", "李强"},
                        {"项目组长", "王振、施海涛"},
                        {"组员", "德勤项目组"}
                };

        //向表格中填充数据
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 2; j++)
            {
                table.get(j, i).getTextFrame().setText(dataStr[i][j]);
                table.get(j, i).getTextFrame().getParagraphs().get(0).setAlignment(TextAlignmentType.CENTER);
                table.get(j,i).setTextAnchorType(TextAnchorType.CENTER);
                table.get(j, i).getTextFrame().getParagraphs().get(0).getTextRanges().get(0).setLatinFont(new TextFont("微软雅黑"));
                table.get(j, i).getTextFrame().getParagraphs().get(0).getTextRanges().get(0).setFontMinSize(16f);
//                table.get(j, i).getTextFrame().getParagraphs().get(0).getTextRanges().get(0).setFontHeight(60f);
            }
            table.get(0, i).getFillFormat().setFillType(FillFormatType.SOLID);
            table.get(0, i).getFillFormat().getSolidColor().setColor(new Color(79, 129, 189));
            table.get(0, i).getTextFrame().getParagraphs().get(0).getTextRanges().get(0).getFill().setFillType(FillFormatType.SOLID);
            table.get(0, i).getTextFrame().getParagraphs().get(0).getTextRanges().get(0).getFill().getSolidColor().setColor(Color.white);
        }

        //ppt第八页
        Map<String,String> map8 = new HashMap<String, String>();
        map8.put("五","五、配合要求");
        map8.put("小标题","审计单位需配合工作");
        replaceText(slide7,map8);
        IAutoShape shape7 = slide7.getShapes().appendShape(ShapeType.RECTANGLE, new Rectangle2D.Float(25, 115, 670, 280));
        shape7.getFill().setFillType(FillFormatType.NONE);
        shape7.getFill().getSolidColor().setColor(new Color(79, 129, 189));
        shape7.getLine().setWidth(1.5d);
        shape7.getTextFrame().getParagraphs().clear();

        String htmlString7 = "<p style = 'color:black'>中国移动内部审计章程（中移审[2010]71号）中已内部审计人员的责任和相关必要权限，其中与本次审计相关的权限如下：\n" +
                "(一) 检查有关生产、经营和财务活动的资料、文件和现场勘察实物。 \n" +
                "(二) 检查有关的计算机系统及其电子数据和资料。 \n" +
                "(三) 针对审计中发现的问题提出完善内部控制、改进经营管理、提高经济效益的建议，依据公司管理制度提出纠正、处理建议。" +
                "<p>中国移动内部审计章程明确，如“被审计单位违反本章程，拒绝提供与审计事项有关的文件、资料及证明材料的，或者提供虚假资料、阻碍检查的，无正当理由拒不执行审计结论的，内部审计机构应当责令其限期改正；拒不改正的，内部审计机构可建议公司给予惩处。”";
        shape7.getTextFrame().getParagraphs().addFromHtml(htmlString7);
        setParagraphStyle(ppt,shape7);

        //ppt第九页
        Map<String,String> map9 = new HashMap<String, String>();
        map9.put("五","五、配合要求（续）");
        map9.put("小标题1","审计单位需配合工作");
        map9.put("小标题2","资料提供配合要求");
        replaceText(slide8,map9);
        String fiveHtml = "<p style = 'color:black'><strong>协调配合审计组实地勘察的各项工作；</strong>" +
                "<p>确定本次审计工作联系人，配合审计组完成资料收集、数据提取、人员访谈安排等工作；" +
                "<p>各部门负责人填写并提交《审计承诺书》，承诺审计资料提供的真实、完整、及时，积极配合审计组开展的流程穿越等各项工作；" +
                "<p>配合沟通审计发现，对《内审事项确认单》的内容逐项确认并反馈意见。";

        IAutoShape shape8 = slide8.getShapes().appendShape(ShapeType.RECTANGLE, new Rectangle2D.Float(25, 105, 670, 160));
        shape8.getFill().setFillType(FillFormatType.NONE);
        shape8.getFill().getSolidColor().setColor(new Color(79, 129, 189));
        shape8.getLine().setWidth(1.5d);
        shape8.getTextFrame().getParagraphs().clear();
        shape8.getTextFrame().getParagraphs().addFromHtml(fiveHtml);
        setParagraphStyle(ppt,shape8);

        String fiveHtml1 = "<p style = 'color:black'>相关业务部门应全力支持配合审计工作，及时提供审计所需资料，有效保证审计工作质量；" +
                "<p>按审计组规定的时间提供审计工作中所需的各项资料，一次完成资料提供，原则上不接收同一需求的第二次提供的资料；" +
                "<p>个别资料确因特殊情况未能按时提供的，请及时与审计组沟通，承诺资料提供时间，并请各部门领导及分公司领导督促相关人员提供；" +
                "<p>所有样本以邮件收到时间作为资料收到时间；" +
                "<p>审计组现场审计提出的需求，若在现场结束后才提供的，原则上不再进行分析。";
        IAutoShape shape81 = slide8.getShapes().appendShape(ShapeType.RECTANGLE, new Rectangle2D.Float(25, 310, 670, 220));
        shape81.getFill().setFillType(FillFormatType.NONE);
        shape81.getFill().getSolidColor().setColor(new Color(79, 129, 189));
        shape81.getLine().setWidth(1.5d);
        shape81.getTextFrame().getParagraphs().clear();
        shape81.getTextFrame().getParagraphs().addFromHtml(fiveHtml1);
        setParagraphStyle(ppt,shape81);

        //ppt第十页
        Map<String,String> map10 = new HashMap<String, String>();
        map10.put("五","五、配合要求（续）");
        map10.put("小标题","流程穿越、内审事项确认配合工作\n");
        replaceText(slide9,map10);
        IAutoShape shape9 = slide9.getShapes().appendShape(ShapeType.RECTANGLE, new Rectangle2D.Float(25, 105, 670, 280));
        shape9.getFill().setFillType(FillFormatType.NONE);
        shape9.getFill().getSolidColor().setColor(new Color(79, 129, 189));
        shape9.getLine().setWidth(1.5d);
        shape9.getTextFrame().getParagraphs().clear();

        String htmlString = "<p style = 'color:black'>根据审计组的工作内容，及时安排具体对应的业务经办人员参与访谈，并确保访谈的内容真实、完整、有效；" +
                "<p>配合审计组查看本部门开发和使用的所有信息系统，详细介绍系统各模块及菜单的功能、操作步骤、系统的报表等，" +
                "审计组如果需要，及时提供系统账号给审计组使用。" +
                "<p>审计过程中，审计组会陆续发出《内审事项确认单》，" +
                "<strong><span style = 'color: red'>确认单包括资料提供、访谈记录、过程事项、问题等方面的确认单，</span></strong>" +
                "在审计组规定的时间内完成核实、反馈和确认，以及将签字、盖章版的纸质确认单交给审计组";
        shape9.getTextFrame().getParagraphs().addFromHtml(htmlString);
        setParagraphStyle(ppt,shape9);

        //ppt第十一页
        Map<String,String> map11 = new HashMap<String, String>();
        map11.put("六","六、审计纪律");
        map11.put("小标题","内部审计人员的纪律要求");
        replaceText(slide10,map11);
        String htmlContent12 = "<p>中国移动内部审计章程、中国移动内部审计人员职业操守和纪律守则中均明确了内部审计人员：</p>" +
                "<p>应当遵循保密性原则，按规定谨慎使用和保护其在履行职责时所获取的资料,非经资料所属单位或内审部门负责人的同意，不得将资料提供给任何第三方；</p>" +
                "<p>审计发现问题证据客观、沟通充分，并通过《内审事项确认单》进行书面确认；</p>" +
                "<p>审计人员在现场审计期间需严格遵守了公司的办公纪律;</p>" +
                "<p>不得接受被审计单位或个人赠送的礼品（包括现金、有价证券、支付凭证以及贵重物品等）；</p>" +
                "<p>不得参与被审计单位安排的宴请、旅游、娱乐和联欢等可能妨碍其公正评价的各种活动；</p>" +
                "<p>按照公司的差旅标准选择入住酒店并支付相关费用,工作日原则上应在被审计单位的员工餐厅用餐；</p>" +
                "<p>不得使用被审计单位的交通工具、通讯工具等办公条件办理与审计工作无关的事项；</p>" +
                "<p>不得到被审计单位报销任何与审计工作无关的费用。</p>";
//        htmlContent12.replaceAll("</p>","");
        IAutoShape shape10 = (IAutoShape) slide10.getShapes().appendShape(ShapeType.RECTANGLE, new Rectangle2D.Float(25, 110, 670, 420));
        shape10.getFill().setFillType(FillFormatType.NONE);
        shape10.getFill().getSolidColor().setColor(new Color(79, 129, 189));
        shape10.getLine().setWidth(1.5d);
        shape10.getTextFrame().getParagraphs().clear();
        shape10.getTextFrame().getParagraphs().addFromHtml(htmlContent12);
        setParagraphStyle(ppt,shape10);

        //超过500字
        if (copyIndexList != null){
            for (int i = 0; i < copyIndexList.size(); i++) {
                ISlide iSlidecopy = copySlideList.get(i);
                ppt.getSlides().insert(copyIndexList.get(i), copySlideList.get(i));
                Map mapCopy = new HashMap();
                mapCopy.put(replaceString.get(i),copyString.get(i));
                replaceText(iSlidecopy,mapCopy);
            }
        }

        //保存文档
        ppt.saveToFile("E:\\test\\ppt\\启动会材料.pptx", FileFormat.PPTX_2013);
    }

    private static void setParagraphStyle(Presentation ppt, IAutoShape shape) throws Exception {
        for (int i = 0; i < shape.getTextFrame().getParagraphs().getCount(); i++) {
            ParagraphEx paragraph = shape.getTextFrame().getParagraphs().get(i);
            paragraph.setBulletType(TextBulletType.PICTURE);//设置项目符号样式为图片
            BufferedImage image = ImageIO.read(new File("E:\\test\\ppt\\xmf.png"));//加载图片
            paragraph.getBulletPicture().setEmbedImage(ppt.getImages().append(image));//添加图片作为项目符号样式
//            paragraph.setLeftMargin(14.3f);
            paragraph.setIndent(20);
            paragraph.setSpaceBefore(20f);
            paragraph.setLineSpacing(150f);
            for (int j = 0; j < paragraph.getTextRanges().getCount(); j++) {
                PortionEx textRange = paragraph.getTextRanges().get(j);
                textRange.getFormat().setEastAsianFont(new TextFont("微软雅黑"));
                textRange.getFormat().setFontHeight(16);
                textRange.getFill().setFillType(FillFormatType.SOLID);
                textRange.getFill().getSolidColor().setColor(Color.black);
            }
        }
    }

    public static void replaceText(ISlide slide, Map map) {

        for (Object shape : slide.getShapes()
        ) {

            if (shape instanceof IAutoShape) {

                for (Object paragraph : ((IAutoShape) shape).getTextFrame().getParagraphs()
                ) {
                    ParagraphEx paragraphEx = (ParagraphEx)paragraph;
                    for (Object key : map.keySet()
                    ) {
                        if (paragraphEx.getText().contains((String)key)) {

                            paragraphEx.setText(paragraphEx.getText().replace((String)key, (String)map.get(key)));
                        }
                    }
                }
            }
        }
    }

    public static Presentation copySlide(){
        //创建文档
        Presentation ppt = new Presentation();
        //加载PowerPoint文档
        try {
            ppt.loadFromFile("E:\\test\\ppt\\a.pptx");
            //获取第1张幻灯片（被复制的幻灯片）
            ISlide slide = ppt.getSlides().get(1);
            IAutoShape shape = (IAutoShape) ppt.getSlides().get(2).getShapes().get(1);

            shape.getTextFrame().getParagraphs();


            //单张复制：将第1张幻灯片复制后，作为第3张幻灯片
            int index = 2;
            ppt.getSlides().insert(index, slide);

            //循环复制：循环插入2张复制后的幻灯片，作为第4张和第5张幻灯片
            //        for(int i = 3;i < 5;i++) {
            //            ppt.getSlides().insert(i, slide);
            //        }
            //保存文档
            ppt.saveToFile("E:\\test\\ppt\\d.pptx",FileFormat.PPTX_2013);
            ppt.dispose();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ppt;
    }


}